home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / fwcp / src / more.c < prev    next >
Text File  |  1995-03-31  |  6KB  |  346 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <malloc.h>
  4. #include    <ctype.h>
  5. #include    <jctype.h>
  6. #include    <string.h>
  7. #include    "defs.h"
  8. #include    "key.h"
  9.  
  10. #define    TAB    8
  11.  
  12. #define    READMAX    4096
  13.  
  14. typedef    struct    _LP {
  15.     struct    _LP    *next;
  16.     struct    _LP    *back;
  17.     char        line[1];
  18. } LINPTR;
  19.  
  20. static    FILE    *fp;
  21. static    LINPTR    *now;
  22. static    int    line = (-1);
  23. static    int    top = 0;
  24. static    int    scan = 0;
  25.  
  26. static    int    text_mode = TRUE;
  27. static    unsigned long    addr = 0L;
  28. static    int    read_pos = 0;
  29. static    int    read_max = 0;
  30. static    unsigned char    read_buf[READMAX];
  31.  
  32. static    void    readinit()
  33. {
  34.     int n;
  35.     int len = 0;
  36.  
  37.     addr = 0L;
  38.     read_pos = 0;
  39.     read_max = fread(read_buf, 1, READMAX, fp);
  40.  
  41.     for ( n = 0 ; n < read_max ; n++ ) {
  42.     switch(read_buf[n]) {
  43.     case '\n': case '\r': case '\t': case '\f': case '\b':
  44.         break;
  45.     case 0x7F: case 0xFE: case 0xFF:
  46.         len++;
  47.         break;
  48.     default:
  49.         if ( read_buf[n] < ' ' )
  50.         len++;
  51.         break;
  52.     }
  53.     }
  54.  
  55.     text_mode = (len > 10 ? FALSE : TRUE);
  56. }
  57. static    int    readchar()
  58. {
  59.     if ( read_pos >= read_max ) {
  60.     read_pos = 0;
  61.     if ( (read_max = fread(read_buf, 1, READMAX, fp)) <= 0 )
  62.         return EOF;
  63.     }
  64.     return (read_buf[read_pos++]);
  65. }
  66. static    LINPTR    *readline()
  67. {
  68.     int n;
  69.     int ch;
  70.     int len = 0;
  71.     LINPTR *lp;
  72.     unsigned char *p;
  73.     char buf[LINSIZ];
  74.  
  75.     if ( text_mode == FALSE ) {
  76. /********
  77. 01234567890123456789012345678901234567890123456789012345678901234567890123456
  78. 00000000  00 01 02 03 04 05 06 07 - 08 09 0a 0b 0c 0d 0e 0f  0123456789abcdef
  79. *********/
  80.     sprintf(buf, "%08lx ", addr);
  81.     len = 9;
  82.     p = buf + 61;
  83.     for ( n = 0 ; n < 16 ; n++ ) {
  84.         if ( (ch = readchar()) == EOF )
  85.         break;
  86.         sprintf(buf + len, "%s%02x", (n == 8 ? " - " : " "), ch);
  87.         len += strlen(buf + len);
  88.         if ( ch < ' ' || ch == 0x7F )
  89.         ch = '.';
  90.         *(p++) = ch;
  91.     }
  92.     if ( n == 0 )
  93.         return NULL;
  94.     while ( len < 61 )
  95.         buf[len++] = ' ';
  96.     len = (p - buf);
  97.     *p = '\0';
  98.     for ( p = buf + 61 ; *p != '\0' ; p++ ) {
  99.         if ( iskanji(p[0]) ) {
  100.         if ( iskanji2(p[1]) )
  101.             p++;
  102.         else
  103.             p[0] = '.';
  104.         } else if ( (p[0] >= 0x80 && p[0] <= 0x9F) ||
  105.             (p[0] >= 0xE0 && p[0] <= 0xFF) )
  106.         p[0] = '.';
  107.     }
  108.     addr += 16;
  109.  
  110.     } else {
  111.     while ( len < SCR_X && (ch = readchar()) != EOF ) {
  112.         if ( iskanji(ch) ) {
  113.         if ( len >= (SCR_X - 1) ) {
  114.             read_pos--;
  115.             break;
  116.         }
  117.         buf[len++] = ch;
  118.         if ( (ch = readchar()) == EOF ) {
  119.             len--;
  120.             break;
  121.         }
  122.         buf[len++] = ch;
  123.  
  124.         } else if ( ch == '\t' ) {
  125.         n = TAB - (len % TAB);
  126.         while ( len < SCR_X && n-- > 0 )
  127.             buf[len++] = ' ';
  128.  
  129.         } else if ( ch == '\n' ) {
  130.         break;
  131.  
  132.         } else if ( ch != '\r' && ch != 0x1A )
  133.         buf[len++] = ch;
  134.     }
  135.     }
  136.  
  137.     buf[len] = '\0';
  138.  
  139.     if ( len == 0 && ch == EOF )
  140.     return NULL;
  141.  
  142.     if ( (lp = (LINPTR *)malloc(sizeof(LINPTR) + len)) == NULL )
  143.     return NULL;
  144.  
  145.     lp->next = lp->back = NULL;
  146.     strcpy(lp->line, buf);
  147.  
  148.     return lp;
  149. }
  150. char    *getline(int no)
  151. {
  152.     while ( no < line ) {
  153.     if ( now->back == NULL )
  154.         return NULL;
  155.     now = now->back;
  156.     line--;
  157.     }
  158.  
  159.     while ( no > line ) {
  160.     if ( now->next == NULL ) {
  161.         if ( (now->next = readline()) == NULL )
  162.         return NULL;
  163.         now->next->back = now;
  164.     }
  165.     now = now->next;
  166.     line++;
  167.     }
  168.  
  169.     return now->line;
  170. }
  171. int    putline(int y, int no)
  172. {
  173.     char *p;
  174.  
  175.     LOCATE(0, y);
  176.     if ( (p = getline(no)) != NULL ) {
  177.     PUTS(p);
  178.     if ( strlen(p) < SCR_X )
  179.         ERALINE();
  180.     return FALSE;
  181.     } else {
  182.     ERALINE();
  183.     return ERR;
  184.     }
  185. }
  186. void    forscrool()
  187. {
  188.     if ( getline(top + (SCR_Y - 1)) == NULL )
  189.     return;
  190.     top++;
  191.     FORSCROOL();
  192.     putline(SCR_Y - 2, line);
  193.     LOCATE(0, SCR_Y - 1);
  194. /**********
  195.     FLUSH();
  196. ***********/
  197. }
  198. void    backscrool()
  199. {
  200.     if ( top <= 0 )
  201.     return;
  202.     top--;
  203.     BAKSCROOL();
  204.     putline(0, top);
  205.     LOCATE(0, SCR_Y - 1);
  206.     ERALINE();
  207. /*************
  208.     FLUSH();
  209. **************/
  210. }
  211. int    more(char *file)
  212. {
  213.     int n, ch;
  214.     LINPTR *lp;
  215.     char *p;
  216.     char buf[128 + 2];
  217.  
  218.     if ( (fp = fopen(file, "rb")) == NULL )
  219.     return ERR;
  220.  
  221.     line = top = 0;
  222.     readinit();
  223.     if ( (now = readline()) == NULL ) {
  224.     fclose(fp);
  225.     return ERR;
  226.     }
  227.  
  228.     SAVESCREEN();
  229.  
  230.     for ( n = 0 ; n < (SCR_Y - 1) ; n++ )
  231.     putline(n, n);
  232.     LOCATE(0, n);
  233.     ERALINE();
  234.     FLUSH();
  235.  
  236.     buf[0] = '\0';
  237.  
  238.     for ( ; ; ) {
  239.     ch = GETCH();
  240.  
  241.     switch(ch) {
  242.     case K_ABORT:
  243.     case K_END_OF:
  244.     case 'Q': case 'q':
  245.         goto ENDOF;
  246.  
  247.     case ' ':
  248.         for ( n = 0 ; n < (SCR_Y - 3) ; n++ )
  249.         forscrool();
  250.         break;
  251.  
  252.     case K_BACK_SPC:
  253.         for ( n = 0 ; n < (SCR_Y - 3) ; n++ )
  254.         backscrool();
  255.         break;
  256.  
  257.     case K_UP_NODE:
  258.         backscrool();
  259.         break;
  260.  
  261.     case K_DOWN_NODE:
  262.     case K_END_LINE:
  263.         forscrool();
  264.         break;
  265.  
  266.     case K_SCREEN_FLUSH:
  267.     REDISP:
  268.         for ( n = 0 ; n < (SCR_Y - 1) ; n++ )
  269.         putline(n, top + n);
  270.         LOCATE(0, SCR_Y - 1);
  271.         break;
  272.     
  273.     case 'n': case 'N':
  274.     SERCH:
  275.         if ( buf[0] == '\0' )
  276.         break;
  277.         LOCATE(0, SCR_Y - 1);
  278.         FPUTS("/%-78.78s", buf);
  279.         ERALINE();
  280.         for ( n = scan + 1; ; n++ ) {
  281.         if ( (p = getline(n)) == NULL )
  282.             break;
  283.         else if ( strstr(p, buf) != NULL ) {
  284.             if ( (scan = top = n) > 10 )
  285.             top -= 10;
  286.             goto REDISP;
  287.         }
  288.         }
  289.  
  290.     NOTFOUND:
  291.         scan = 0;
  292.         BEEP();
  293.         LOCATE(0, SCR_Y - 1);
  294.         FPUTS("not found %s", buf);
  295.         LOCATE(0, SCR_Y - 1);
  296.         break;
  297.  
  298.     case 'p': case 'P':
  299.         if ( buf[0] == '\0' )
  300.         break;
  301.         LOCATE(0, SCR_Y - 1);
  302.         FPUTS("/%-78.78s", buf);
  303.         ERALINE();
  304.         for ( n = scan - 1 ; n > 0 ; n-- ) {
  305.         if ( (p = getline(n)) == NULL )
  306.             break;
  307.         else if ( strstr(p, buf) != NULL ) {
  308.             if ( (scan = top = n) > 10 )
  309.             top -= 10;
  310.             goto REDISP;
  311.         }
  312.         }
  313.         goto NOTFOUND;
  314.  
  315.     case '/':
  316.         LOCATE(0, SCR_Y - 1);
  317.         PUTS("/");
  318.         for ( ; ; ) {
  319.         ch = input(1, SCR_Y - 1, 78, 128, 0, buf);
  320.         if ( ch == K_END_LINE )
  321.             goto SERCH;
  322.         }
  323.         LOCATE(0, SCR_Y - 1);
  324.         ERALINE();
  325.         break;
  326.     }
  327.     FLUSH();
  328.     }
  329.     ENDOF:
  330.  
  331.     fclose(fp);
  332.  
  333.     while ( now->back != NULL )
  334.     now = now->back;
  335.  
  336.     while ( (lp = now) != NULL ) {
  337.     now = now->next;
  338.     free(lp);
  339.     }
  340.  
  341.     LOADSCREEN();
  342.     FLUSH();
  343.  
  344.     return FALSE;
  345. }
  346.